(function () { 'use strict'; const carousel = document.querySelector('.review-carousel'); if (!carousel) return; const slides = Array.from(carousel.querySelectorAll('.review-slide')); const dots = Array.from(carousel.querySelectorAll('.review-dot')); const stage = carousel.querySelector('.review-carousel-stage'); const status = carousel.querySelector('.review-carousel-status'); const viewer = document.querySelector('.review-lightbox'); const viewerImage = viewer.querySelector('img'); const viewerScroll = viewer.querySelector('.review-lightbox-scroll'); const zoomButton = viewer.querySelector('[data-review-zoom]'); let index = 0; let timer; let inView = true; let returnFocus; let previousOverflow; function canPlay() { return inView && !document.hidden && !viewer.open; } function schedule() { window.clearTimeout(timer); if (canPlay()) timer = window.setTimeout(function () { show(index + 1); }, 5000); } function show(next, announce) { index = (next + slides.length) % slides.length; slides.forEach(function (slide, i) { let distance = (i - index + slides.length) % slides.length; if (distance > slides.length / 2) distance -= slides.length; const position = distance === 0 ? 'is-center' : distance === -1 ? 'is-prev' : distance === 1 ? 'is-next' : distance < 0 ? 'is-off-left' : 'is-off-right'; slide.className = 'review-slide ' + position; slide.tabIndex = Math.abs(distance) <= 1 ? 0 : -1; slide.setAttribute('aria-hidden', Math.abs(distance) > 1 ? 'true' : 'false'); slide.setAttribute('aria-label', 'ग्राहक की तस्वीर ' + (i + 1) + (distance === 0 ? ' बड़ी करें' : ' देखें')); dots[i].classList.toggle('is-active', i === index); dots[i].setAttribute('aria-pressed', i === index ? 'true' : 'false'); }); if (announce) status.textContent = 'तस्वीर ' + (index + 1) + ' / ' + slides.length; if (viewer.open) updateViewer(); schedule(); } function updateViewer() { const image = slides[index].querySelector('img'); viewerImage.src = image.src; viewerImage.alt = image.alt; viewer.querySelector('.review-lightbox-count').textContent = 'तस्वीर ' + (index + 1) + ' / ' + slides.length; viewerScroll.classList.remove('is-zoomed'); zoomButton.textContent = 'ज़ूम +'; zoomButton.setAttribute('aria-pressed', 'false'); viewerScroll.scrollTop = 0; viewerScroll.scrollLeft = 0; } function openViewer(button) { returnFocus = button; previousOverflow = document.body.style.overflow; updateViewer(); viewer.showModal(); document.body.style.overflow = 'hidden'; schedule(); } function toggleZoom() { const zoomed = viewerScroll.classList.toggle('is-zoomed'); zoomButton.textContent = zoomed ? 'ज़ूम −' : 'ज़ूम +'; zoomButton.setAttribute('aria-pressed', String(zoomed)); } slides.forEach(function (slide, i) { slide.addEventListener('click', function () { if (i === index) openViewer(slide); else show(i, true); }); }); dots.forEach(function (dot, i) { dot.addEventListener('click', function () { show(i, true); }); }); carousel.querySelector('[data-review-prev]').addEventListener('click', function () { show(index - 1, true); }); carousel.querySelector('[data-review-next]').addEventListener('click', function () { show(index + 1, true); }); carousel.addEventListener('keydown', function (event) { if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') { event.preventDefault(); show(index + (event.key === 'ArrowRight' ? 1 : -1), true); } }); let start; let swiped = false; stage.addEventListener('pointerdown', function (event) { start = { x: event.clientX, y: event.clientY }; swiped = false; }); stage.addEventListener('pointerup', function (event) { if (!start) return; const dx = event.clientX - start.x; const dy = event.clientY - start.y; start = null; if (Math.abs(dx) > 35 && Math.abs(dx) > Math.abs(dy)) { swiped = true; show(index + (dx < 0 ? 1 : -1), true); } }); stage.addEventListener('pointercancel', function () { start = null; }); stage.addEventListener('click', function (event) { if (swiped) { event.preventDefault(); event.stopImmediatePropagation(); swiped = false; } }, true); viewer.querySelector('[data-review-close]').addEventListener('click', function () { viewer.close(); }); viewer.querySelector('[data-review-lightbox-prev]').addEventListener('click', function () { show(index - 1, true); }); viewer.querySelector('[data-review-lightbox-next]').addEventListener('click', function () { show(index + 1, true); }); zoomButton.addEventListener('click', toggleZoom); viewerImage.addEventListener('click', toggleZoom); viewer.addEventListener('click', function (event) { if (event.target === viewer) viewer.close(); }); viewer.addEventListener('close', function () { document.body.style.overflow = previousOverflow; if (returnFocus) returnFocus.focus({ preventScroll: true }); schedule(); }); viewer.addEventListener('keydown', function (event) { if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') { event.preventDefault(); show(index + (event.key === 'ArrowRight' ? 1 : -1), true); } }); document.addEventListener('visibilitychange', schedule); if ('IntersectionObserver' in window) { new IntersectionObserver(function (entries) { inView = entries[0].isIntersecting; schedule(); }, { threshold: 0.15 }).observe(carousel); } show(0); })();